package org.n3r.idworker.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Utils {

  public static final String DOT_IDWORKERS = ".idworkers";

  public static ClassLoader getClassLoader() {
    ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
    return contextClassLoader != null ? contextClassLoader : Utils.class.getClassLoader();
  }


  public static InputStream classResourceToStream(String resourceName) {
    return getClassLoader().getResourceAsStream(resourceName);
  }


  public static String firstLine(String classResourceName) {
    InputStream inputStream = null;
    try {
      inputStream = classResourceToStream(classResourceName);
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,
          StandardCharsets.UTF_8));

      return bufferedReader.readLine();
    } catch (IOException e) {
      return null;
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
  }

  public static String checkNotEmpty(String param, String name) {
      if (param == null || param.isEmpty()) {
          throw new IllegalArgumentException(name + " is empty");
      }

    return param;
  }


  public static long midnightMillis() {
    // today
    Calendar date = Calendar.getInstance();
    // reset hour, minutes, seconds and millis
    date.set(Calendar.HOUR_OF_DAY, 0);
    date.set(Calendar.MINUTE, 0);
    date.set(Calendar.SECOND, 0);
    date.set(Calendar.MILLISECOND, 0);

    return date.getTimeInMillis();
  }

  public static void main(String[] args) {
    // 2013-12-25 00:00:00.000
    System.out.println(
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Timestamp(midnightMillis())));
    System.out.println(encode(281474976710655L));
  }

  public static long decode(String s, String symbols) {
    final int B = symbols.length();
    long num = 0;
    for (char ch : s.toCharArray()) {
      num *= B;
      num += symbols.indexOf(ch);
    }
    return num;
  }

  public static String encode(long num) {
    return encode(num, defaultRange);
  }

  public static String encode(long num, String symbols) {
    final int B = symbols.length();
    StringBuilder sb = new StringBuilder();
    while (num != 0) {
      sb.append(symbols.charAt((int) (num % B)));
      num /= B;
    }
    return sb.reverse().toString();
  }

  // all un-clearly-recognized letters are skiped.
  static String defaultRange = "0123456789ABCDFGHKMNPRSTWXYZ";

  public static String padLeft(String str, int size, char padChar) {
      if (str.length() >= size) {
          return str;
      }

    StringBuilder s = new StringBuilder();
    for (int i = size - str.length(); i > 0; --i) {
      s.append(padChar);
    }
    s.append(str);

    return s.toString();
  }

  public static File createIdWorkerHome() {
    String userHome = System.getProperty("user.home");
    File idWorkerHome = new File(userHome + File.separator + DOT_IDWORKERS);
    idWorkerHome.mkdirs();
      if (idWorkerHome.isDirectory()) {
          return idWorkerHome;
      }

    throw new RuntimeException("failed to create .idworkers at user home");
  }
}
